from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from django.core.cache import cache
from .models import User

class TokenAuthentication(BaseAuthentication):
    """Token认证类
    
    使用方法:
    1. 用户登录获取token:
       POST /api/v1/users/login/
       返回: {"code": 200, "data": {"token": "xxx"}}
       
    2. 请求时携带token:
       在请求头中添加: Authorization: xxx
    """
    
    def authenticate(self, request):
        # 从请求头获取token
        token = request.META.get('HTTP_AUTHORIZATION')
        
        if not token:
            return None
            
        # 从缓存中获取用户ID
        user_id = cache.get(f'token:{token}')
        
        if not user_id:
            raise AuthenticationFailed({
                'code': 401,
                'message': 'Token无效或已过期'
            })
            
        try:
            # 根据用户ID获取用户对象
            user = User.objects.get(id=user_id)
            
            # 检查用户是否被禁用
            if not user.is_active:
                raise AuthenticationFailed({
                    'code': 403,
                    'message': '用户已被禁用'
                })
                
            return (user, token)
            
        except User.DoesNotExist:
            raise AuthenticationFailed({
                'code': 401,
                'message': '用户不存在'
            })

    def authenticate_header(self, request):
        """
        返回认证方案的名称
        用于在认证失败时返回的WWW-Authenticate头
        """
        return 'Token'